/*
实验4-3 出院
分数 15
作者 DAI, Longao
单位 杭州百腾教育科技有限公司

A：最近出了一个饮料营养等级你们知道吗？例如无糖的饮料是 A 级，可乐是 D 级……
B：那……无糖可乐是什么级别？
C：AD 级吧。
A：出院！
B：出什么院，你也给我进去！

以上是某群中一段有趣的对话。请你按照里面的逻辑，在已知某些饮料的等级的情况下，给饮料定级。定级的方法是：

    如果是已知等级的饮料，直接输出等级；
    对于一个新饮料的名字，你需要将名字拆成两个已知等级的部分，然后输出这个级别。例如：Diet是A，Coke是D，那么DietCoke就是AD；
    如果新饮料无法拆解或者有多种拆解方法，统一定为 D 级。

输入格式:

输入第一行是两个正整数 N,M (1≤N,M≤100)，表示已知的饮料有 N 种，需要定级的饮料有 M 种。

接下来首先是 N 行，每行是一个字符串和一个字符，表示一种饮料的名字和对应的等级，等级只有 A,B,C,D 四种。

然后是 M 行，每行是一个字符串，表示需要定级的饮料的名字。

所有饮料名字只包含有大小写字母，长度不超过 30，给定拥有等级的饮料的名字不会重复。
输出格式:

对于每一个需要定级的饮料，输出定好的定级。
输入样例:

5 6
Diet A
LowSugarTea B
Milk C
Coke D
Water A
DietCoke
Pepsi
Milk
CokeWater
GoodMilk
dietCoke

输出样例:

AD
D
C
DA
D
D
*/

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main() {
    int N, M;
    cin >> N >> M;
    map<string, string> drinks;
    for (int i = 0; i < N; i++) {
        string name, level;
        cin >> name >> level;
        drinks[name] = level;
    }
    for (int i = 0; i < M; i++) {
        string name;
        cin >> name;
        if (drinks.find(name) != drinks.end()) {
            cout << drinks[name] << endl;
        } else {
            string level = "D";
            int count = 0;
            for (int j = 1; j < name.size(); j++) {
                string left = name.substr(0, j);
                string right = name.substr(j);
                if (drinks.find(left) != drinks.end() && drinks.find(right) != drinks.end()) {
                    level = drinks[left] + drinks[right];
                    // break;
                    count++;
                }
            }
            if (count > 1) {
                // 有多种拆解方法，统一定为 D 级。
                cout << "D" << endl;
            } else {
                cout << level << endl;
            }
        }
    }
    return 0;
}